package com.chukun.multi.pipeline.reusable;

import java.util.concurrent.TimeUnit;

/**
 * 对处理阶段的抽象
 * 负责对输入进行处理，并将输出作为下一个处理阶段的输入
 * @param <IN>
 * @param <OUT>
 */
public interface Pipe<IN,OUT> {

    /**
     * 设置当前的Pipe实例的下一个Pipe实例
     * @param nextPipe
     */
    void setNextPipe(Pipe<IN,OUT> nextPipe);

    /**
     * 初始化当前的Pipe实例对外提供服务
     * @param pipeCtx
     */
    void init(PipeContext pipeCtx);

    /**
     * 停止当前的实例对外提供服务
     * @param timeout
     * @param unit
     */
    void shutdown(long timeout, TimeUnit unit);

    /**
     * 对输入的元素处理，并将处理结果作为下一个Pipe实例的输入
     * @param input
     * @throws InterruptedException
     */
    void process(IN input) throws InterruptedException;
}
